package transientTest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 根据面向对象原则，只要父类实现Serializable接口，子类也是默认实现的
 * 对于transient，传输对象过来之后一般为默认值，如int类型的为0，String类型的为null（而非初始设定值）
 * @author lcx
 *
 */
public class TransientTest {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		
		ByteArrayOutputStream bos=new ByteArrayOutputStream();
		ObjectOutputStream oos=new ObjectOutputStream(bos);
		Son son=new Son();
		son.name="xiaoming";
		son.score=90;
		son.age=25;
		son.friend.name="xiaohong";
		
		//在反序列化之前设置age为40
		Son.age=40;
		oos.writeObject(son);
		ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
		ObjectInputStream ois=new ObjectInputStream(bis);
		Son son1=(Son) ois.readObject();
		son1.info();
		son1.friend.info();
	}
}

/**
 * 若不实现Serializable，则会抛出 java.io.NotSerializableException的运行时异常
 * @author lcx
 *
 */
class Father implements Serializable
{
	String name="";
}

class Son extends Father
{
	static int age=1;
	transient int score=1;
	Friend friend=new Friend();
	//transient可以修饰
//	int score=0;
	public void info()
	{
		System.out.println("son name="+name+"\n   score="+score+"\n  age="+age);
	}
}

/**
 * 若不实现Serializable，则会抛出 java.io.NotSerializableException的运行时异常
 * @author lcx
 *
 */
class Friend implements Serializable
{
	String name="";
	public void info()
	{
		System.out.println("friend name="+name);
	}
}